header{ 
/* código de cabecera */ 
	package practica3;
} 
options{ 
/* opciones comunes a toda la especificación */ 
}


/////////////////////////////// 
// Analizador léxico 
///////////////////////////////
class Analex extends Lexer;
options {
}
tokens {
	SET = "SET";
	IF = "IF";
	TRUE = "TRUE";
	FALSE = "FALSE";
	WHILE = "WHILE";
	FOR = "FOR";
}
BLANCO: (' '|'\t'|"\r\n") {$setType(Token.SKIP);};
protected LETRA : ('a'..'z')|('A'..'Z')|'_';
protected DIGITO : '0'..'9';
protected SLASH : '/';
protected COMILLAS : '"';
NUMERO : (DIGITO)+;
IDENT : LETRA(LETRA|DIGITO)*;
IDENT_SET : DOLAR IDENT;
SEPARADOR : ';';
OPERADOR : '=';
DOLAR : '$';
LLAVE_A : '{';
LLAVE_C : '}';
PARENTESIS_A : '(';
PARENTESIS_C : ')';
MAS : '+';
MENOS : '-';
MAYOR : '>';
MENOR : '<';
PATH : (SLASH(IDENT))+;
CADENA : COMILLAS(LETRA|BLANCO|DIGITO)+COMILLAS;


/////////////////////////////// 
// Analizador sintáctico 
///////////////////////////////
class Anasint extends Parser;
options {
	importVocab = Analex;
}
entrada : (asignacion|asignacionVarDef)* EOF;
asignacion : IDENT OPERADOR (NUMERO|TRUE|FALSE|PATH|CADENA) SEPARADOR ;
asignacionVarDef : SET IDENT_SET OPERADOR (NUMERO|TRUE|FALSE|PATH|CADENA) SEPARADOR (condicional|reglawhile|reglafor)? ;
condicional : IF PARENTESIS_A IDENT_SET PARENTESIS_C LLAVE_A (asignacion|asignacionVarDef)+ LLAVE_C ;
reglawhile: WHILE PARENTESIS_A IDENT_SET PARENTESIS_C LLAVE_A (asignacion|asignacionVarDef)+ LLAVE_C ;
reglafor: FOR PARENTESIS_A asignacion IDENT(MAYOR|MENOR)NUMERO SEPARADOR IDENT((MAS)(MAS)|(MENOS)(MENOS)) PARENTESIS_C LLAVE_A (asignacion|asignacionVarDef)+ LLAVE_C ;

